package com.dongpl.jar2mvn.utils;

import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.io.FileUtils;
//import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Objects;
import java.util.Optional;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

@Slf4j
public class FileValidationUtil {

    /**
     * 验证上传的文件是否为有效的 JAR 包，并检查 pom.xml 的内容是否符合要求。
     *
     * @param file 上传的 MultipartFile 转换的 File
     * @param expectedGroupId 期望的 groupId
     * @param expectedArtifactId 期望的 artifactId
     * @return 验证结果：如果合法返回 true，否则返回 false
     */
    public static boolean validateJar(File file, String expectedGroupId, String expectedArtifactId) {
        if (file == null || !file.exists()) {
            log.error("文件不存在!");
            return false;
        }

        try (JarFile jarFile = new JarFile(file)) {
            if (!file.getName().endsWith(".jar")) {
                log.error("不是jar包!");
                return false;
            }
            // 查找 pom.xml
            Optional<JarEntry> pomEntry = jarFile.stream()
                    .filter(entry -> entry.getName().endsWith("pom.xml"))
                    .findFirst();

            if (pomEntry.isPresent()) {
                // 验证 pom.xml 的内容
                try (InputStream pomStream = jarFile.getInputStream(pomEntry.get())) {
                    return validatePomXml(pomStream, expectedGroupId, expectedArtifactId);
                }
            } else {
                log.error("不是系统jar包!");
                return false;
            }
        } catch (IOException e) {
            log.error("验证jar包失败!", e);
            return false;
        }
    }

    /**
     * 验证 pom.xml 文件的内容是否符合要求。
     *
     * @param pomStream pom.xml 文件的输入流
     * @param expectedGroupId 期望的 groupId
     * @param expectedArtifactId 期望的 artifactId
     * @return 验证结果：如果合法返回 true，否则返回 false
     */
    private static boolean validatePomXml(InputStream pomStream, String expectedGroupId, String expectedArtifactId) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(pomStream);

            Element root = document.getDocumentElement();
            NodeList groupIdNodes = root.getElementsByTagName("groupId");
            NodeList artifactIdNodes = root.getElementsByTagName("artifactId");

            if (groupIdNodes.getLength() > 0 && artifactIdNodes.getLength() > 0) {
                String pomGroupId = groupIdNodes.item(0).getTextContent().trim();
                String pomArtifactId = artifactIdNodes.item(0).getTextContent().trim();

                // 验证内容
                return expectedGroupId.equals(pomGroupId) && expectedArtifactId.equals(pomArtifactId);
            } else {
                log.error("不是目标jar包!");
                return false;
            }
        } catch (Exception e) {
            log.error("验证 pom.xml 失败!", e);
            return false;
        }
    }


    /**
     * 验证压缩包是否包含第一级目录的 index.html 文件
     *
     * @param file MultipartFile 表示上传的文件
     * @return 如果包含 index.html 文件，返回 true；否则返回 false
     * @throws IOException 如果解压过程中出现错误
     */
//    public static boolean validateZipContainsIndexHtml(MultipartFile file) throws IOException {
//        // 检查文件是否为空
//        if (file == null || file.isEmpty()) {
//            return false;
//        }
//
//        // 创建临时目录用于解压缩
//        File tempDir = File.createTempFile("zip-validation", "");
//        if (!tempDir.delete() || !tempDir.mkdir()) {
//            throw new IOException("无法创建临时目录");
//        }
//
//        try {
//            // 解压文件到临时目录
//            unzipFile(file, tempDir);
//
//            // 检查临时目录中是否包含 index.html 文件
//            for (File f : Objects.requireNonNull(tempDir.listFiles())) {
//                if (f.isFile() && f.getName().equalsIgnoreCase("index.html")) {
//                    return true;
//                }
//            }
//            return false;
//        } finally {
//            // 清理临时目录
//            FileUtils.deleteDirectory(tempDir);
//        }
//    }

    /**
     * 解压 MultipartFile 到指定目录
     *
     * @param file   上传的压缩包文件
     * @param destDir 解压目标目录
     * @throws IOException 如果解压过程中出现错误
     */
//    private static void unzipFile(MultipartFile file, File destDir) throws IOException {
//        try (ZipInputStream zipIn = new ZipInputStream(file.getInputStream())) {
//            ZipEntry entry;
//            while ((entry = zipIn.getNextEntry()) != null) {
//                File destFile = new File(destDir, entry.getName());
//                if (entry.isDirectory()) {
//                    destFile.mkdirs();
//                } else {
//                    destFile.getParentFile().mkdirs();
//                    FileUtils.copyToFile(zipIn, destFile);
//                }
//                zipIn.closeEntry();
//            }
//        }
//    }
}
